9.3.2 通过通道实现消息传递

代码清单9-8展示了两个以goroutine形式独立运行的函数,其中一个函数是投掷器(thrower),它接受一个通道作为参数,然后一个接一个地把一组数字发送到通道里;而另一个函数则是捕捉器(catcher),它会从相同的通道里一个接一个地取出一组数字,并把这些数字打印出来。

代码清单9-8 使用通道实现消息传递

package main
import (
 "fmt"
 "time"
)
func thrower(c chan int) {
 for i := 0; i < 5; i++ {
  c <- i ❶
      fmt.Println("Threw >>", i)
 }
}
func catcher(c chan int) {
 for i := 0; i < 5; i++ {
  num := <-c ❷
      fmt.Println("Caught <<", num)
 }
}
func main() {
 c := make(chan int)
 go thrower(c)
 go catcher(c)
 time.Sleep(100 * time.Millisecond)
}

❶ 把数字值推入通道中

❷ 从通道中取出数字值

运行这个程序将得到以下结果:

Caught << 0
Threw >> 0
Threw >> 1
Caught << 1
Caught << 2
Threw >> 2
Threw >> 3
Caught << 3
Caught << 4
Threw >> 4

在这段输出结果中,某些 Caught 语句出现在了 Threw 语句的前面,但这并不意味着程序的运行出现了错误——之所以会出现这样的乱象,仅仅是因为运行时环境在向通道推入值或者从通道中取出值之后,调度到了打印语句所致。最重要的是,打印语句中出现的数字都是有序的,这意味着投掷器在向通道“投掷”一个数字之后,捕捉器必须先“捕捉”这个数字,然后才能处理下一个数字。

results matching ""

    No results matching ""